package com.heima.ThreadPool.ExecutorService3ways.RealUsing;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;

/**
 * @Author: Ethan Yankang
 * @Program: 面试必会代码
 * @Date: 2024-08-29 12:20
 **/
/*              案例——任务调度与执行
 * @description 展示了先将线程的任务提交至列表中，然后再将每个任务的执行异步结果添加进一个异步结果集合中，最后在取出来集中处理之
 * @params
 * @return
 */


public class TaskScheduling {
    public static void main(String[] args) {
//        创建一个固定大小的线程池
        ExecutorService es = Executors.newFixedThreadPool(3);

//        定义一些任务，并添加到列表中
        List<Callable<String>> tasks = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            final int taskId=i;
            tasks.add(()->{
//                模拟任务执行时间
                Thread.sleep(2000);
                return "Task "+taskId+" completed"+Thread.currentThread().getName();
            });
        }
        /*
         * @description 提交任务并获取处理结果的Future对象 + 创建一个处理结果的list列表
         * @params
         * @return
         */
        List<Future<String>> futures = new ArrayList<>();
        for (Callable<String> task : tasks) {
            Future<String> future = es.submit(task);
            futures.add(future);
        }
        /*
         * @description 获取线程的处理任务结果
         * @params
         * @return
         */
        for (Future<String> future : futures) {
            try {
                String result = future.get(3, TimeUnit.SECONDS);
                System.out.println(result);
            } catch (TimeoutException e) {
                System.out.println("任务超时，取消任务");
                future.cancel(true);
            }catch (Exception e){
                System.out.println("任务失败："+e.getMessage());
            }
        }

        /*
         * @description 关闭线程池
         * @params
         * @return
         *
         */
        es.shutdown();
    }
}

